home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / C64 / H-Graphics / (c)h6.d64 / hrsupp.src.c < prev    next >
C/C++ Source or Header  |  2007-02-04  |  9KB  |  551 lines

  1. .OPT NOL
  2. ;
  3. ;** HRSUPP/64 **
  4. ;
  5. ORIGIN = $6000
  6. ;
  7. ;** EQUATES **
  8. ;
  9. ;SYSTEM ROUTINES
  10. ;
  11. ERROR = $A437 ;PRINT ERROR MESSAGE
  12. EVAEXP = $AD9E ;EVALUATE EXPRESSION
  13. CHKCOM = $AEFD ;CHECK FOR COMMA
  14. FLTFIX = $B1AA ;CONVERT TO FIXED IN Y (LOW) AND A (HIGH)
  15. ;
  16. ;VECTORS
  17. ;
  18. ERRVEC = $0300 ;ERROR ROUTINE
  19. WARMV = $0302 ;BASIC WARM START
  20. ;
  21. ;HI-RES STUFF
  22. ;
  23. VIC = $D000 ;ADDRESS OF VIC CHIP
  24. HRCTRL = VIC+17 ;MODE CONTROL
  25. HRMREG = VIC+24 ;MEMORY CONTROL
  26. ;
  27. SCREEN = $0400 ;1K SCREEN
  28. SCREND = SCREEN+999 ;LAST SCREEN LOC'N
  29. BASE = $2000 ;START OF 8K BYT
  30. HRLAST = BASE+7999 ;LAST LOC'N
  31. RAM = $033C ;USE CASSETTE BUFFER
  32. ;
  33. ;**ZERO PAGE**
  34. ;
  35. BYT = $FD ;BYT POINTER
  36. ;
  37. *=RAM
  38. ;
  39. X1 *=*+2 ;X COORDINATE (0 - 319)
  40. X2 *=*+2
  41. Y1 *=*+2 ;Y COORDINATE (0 - 199)
  42. Y2 *=*+2
  43. BITNO *=*+1 ;ON BIT IS PIXEL
  44. DELTX *=*+2 ;X2-X1
  45. DELTY *=*+2 ;Y2-Y1
  46. E *=*+2
  47. T *=*+2
  48. C *=*+2
  49. I *=*+1 ;DIRECTION POINTER
  50. TEMP *=*+2
  51. ERVEC *=*+2 ;HOLDS SYSTEM ERROR VECTOR
  52. ;
  53. ;CONSTANTS
  54. ;
  55. XMAX=320
  56. YMAX=200
  57. COLS=40 ;NUMBER OF COLUMNS/ROW
  58. COLOR=$50 ;FOREGROUND/BACKGROUND = BLACK/GREEN
  59. ;
  60. *=ORIGIN
  61. ;
  62. ;JUMP TABLE FOR COVENIENT ENTRY POINTS
  63. ;
  64. JINIT JMP HRINIT ;INITIALIZE
  65. JREST JMP HRREST ;RESTORE
  66. JCLR JMP CLRHR ;CLEAR SCREEN
  67. JDRAW JMP VECPLT ;DRAW STRAIGHT LINE
  68. JSETPX JMP SETPIX ;TURN ON PIXEL
  69. ;
  70. ;FALL THROUGH TO MOVE ROUTINE
  71. ;
  72. ;HRADDR - GIVEN X-COORD (2 BYTES)
  73. ;AND Y-COORD (1 BYTE)
  74. ;CALCULATE BYT ADDRESS AND BITNO
  75. ;
  76. ;CLOBBERS X, LEAVES Y=0
  77. ;
  78. ;ENTER HERE IF FROM BASIC
  79. ;
  80. HRMOVE JSR GETVAL ;GET X1
  81.  STY X1
  82.  STY X2 ;FOR RNGCHK
  83.  STA X1+1
  84.  STA X2+1
  85.  JSR GETVAL ;GET Y1
  86.  STY Y1
  87.  STY Y2
  88.  STA Y2+1
  89.  JSR RNGCHK
  90. ;
  91. ;ENTER HERE IF X1, Y1 ARE SET
  92. ;
  93. HRADDR LDA #0 ;SET HIGH BYTE TO ZERO
  94.  STA BYT+1
  95.  SEC ;FORM 199-Y1
  96.  LDA #YMAX-1
  97.  SBC Y1
  98.  PHA ;SAVE RESULT ON STACK
  99.  AND #$F8 ;FORM ROW #
  100.  ASL A ;MULT BY 2
  101.  ROL BYT+1
  102.  ASL A ;MULT BY 4
  103.  ROL BYT+1
  104.  ASL A ;MULT BY 8
  105.  ROL BYT+1
  106.  PHA ;SAVE ON STACK
  107.  STA TEMP ;AND IN TEMP
  108.  LDA BYT+1
  109.  STA TEMP+1 ;TEMP HAS 8*Y
  110.  PLA ;RESTORE A
  111.  ASL A ;MULT BY 16
  112.  ROL BYT+1
  113.  ASL A ;MULT BY 32
  114.  ROL BYT+1 ;(CARRY STILL CLEAR)
  115.  ADC TEMP ;FORM 32+8 = 40*
  116.  STA BYT ;INTO BYT
  117.  LDA BYT+1
  118.  ADC TEMP+1
  119.  STA BYT+1
  120.  LDA X1 ;NOW ADD CHAR
  121.  AND #$F8
  122.  ADC BYT
  123.  STA BYT
  124.  LDA X1+1
  125.  ADC BYT+1
  126.  STA BYT+1 ;(CARRY STILL CLEAR)
  127.  PLA ;NOW ADD LINE
  128.  AND #7 ;BY MASKING HIGH BITS
  129.  ADC BYT
  130.  STA BYT
  131.  LDA BYT+1 ;FINISH BY ADDING BASE
  132.  ADC #>BASE
  133.  STA BYT+1
  134.  LDA X1 ;SET BITNO
  135.  AND #7 ;IS LOW 3 BITS
  136.  TAX ;AND INDEX TO TABLE
  137.  LDA MSKTB,X
  138.  STA BITNO
  139.  RTS ;BYT AND BITNO NOW SET
  140. ;
  141. ;*** FASTPLOT ***
  142. ;
  143. ;GRAPHIC SUBROUTINE FOR LINE DRAWING
  144. ;ON 320*200 HI-RES MEMORY
  145. ;
  146. ;ORIGINALLY WRITTEN AS VECTOR GENERATOR
  147. ;FOR HOUSTON INSTRUMENT HIPLOT
  148. ;DIGITAL INCREMENTAL PLOTTER
  149. ;
  150. ;MORE EFFICIENT ALGORITHM BY W. MCWORTER
  151. ;IN BYTE MAY 1981, P202
  152. ;
  153. ;RE-WRITTEN FOR MTU VISIBLE MEMORY (TM)
  154. ;BY F. COVITZ, AUG. 1981
  155. ;REVISED NOV. 1982 FOR CBM-64
  156. ;
  157. ;
  158. ;*****************************
  159. ;* TYPO IN ORIGINAL LETTER   *
  160. ;*                           *
  161. ;* IT READS; A$="RQVWPS...." *
  162. ;*                   *       *
  163. ;*SHOULD BE; A$="RQVWRS...." *
  164. ;*                           *
  165. ;*****************************
  166. ;
  167. ;COME IN WITH X1,Y1 AND X2,Y2
  168. ;AND FIRST PIXEL SET
  169. ;I.E. BYT,BYT+1, AND BITNO ARE SET
  170. ;VIA CALL TO PIXADR
  171. ;ROUTINE DRAWS BEST STRAIGHT LINE
  172. ;LEAVES WITH X1_X2,Y1_Y2
  173. ;
  174. ;LEAVES WITH Y=0, X CLOBBERED
  175. ;ROUTINE CHECKS FOR OVERFLOW
  176. ;
  177. ;**VECPLT**
  178. ;
  179. ;ENTER HERE FROM BASIC
  180. ;
  181. VECPLT JSR GETVAL ;GET X-COORD
  182.  STY X2
  183.  STA X2+1
  184.  JSR GETVAL ;GET Y-COORD
  185.  STY Y2
  186.  STA Y2+1
  187. ;
  188. ;ENTER HERE IF X2, Y2 ALREADY SET
  189. ;
  190. VECPL1 JSR RNGCHK ;CHECK X2,Y2 OVERFLOW
  191.  SEC ;FORM DELTX (SIGNED)
  192.  LDA X2
  193.  SBC X1
  194.  STA DELTX
  195.  LDA X2+1
  196.  SBC X1+1
  197.  STA DELTX+1
  198.  SEC ;FORM DELTY (SIGNED)
  199.  LDA Y2
  200.  SBC Y1
  201.  STA DELTY
  202.  LDA Y2+1
  203.  SBC Y1+1
  204. ;
  205.  STA DELTY+1
  206.  LDA X2 ;X1,Y1_X2,Y2
  207.  STA X1
  208.  LDA X2+1
  209.  STA X1+1
  210.  LDA Y2
  211.  STA Y1
  212.  LDA Y2+1
  213.  STA Y1+1
  214. ;
  215. ;NOW HAVE DELTX,DELTY (SIGNED)
  216. ;
  217. ;** MOVE **
  218. ;
  219. ;GIVEN DELTX, DELTY
  220. ;DRAW/MOVE THE BEST STRAIGHT LINE
  221. ;
  222. MOVE LDA #0 ;DETERMINE OCTANT
  223.  STA I
  224.  BIT DELTX+1 ;CHECK DELTX < 0
  225.  BPL MV1
  226.  LDA DELTX ;CHANGE SIGN
  227.  JSR COMPL
  228.  STA DELTX
  229.  LDA DELTX+1
  230.  JSR COMPH
  231.  STA DELTX+1
  232.  LDA #2
  233.  STA I
  234. MV1 BIT DELTY+1 ;CHECK DELTY < 0
  235.  BPL MV2
  236.  LDA DELTY
  237.  JSR COMPL
  238.  STA DELTY
  239.  LDA DELTY+1
  240.  JSR COMPH
  241.  STA DELTY+1
  242.  CLC
  243.  LDA I
  244.  ADC #4
  245.  STA I
  246. MV2 LDX DELTX ;CHECK DELTX-DELTY
  247.  CPX DELTY ;SET CARRY FOR LOW BYTE
  248.  LDA DELTX+1 ;NOW HIGH BYTE
  249.  TAY ;SET Y = DELTX
  250.  SBC DELTY+1
  251.  BPL MV3
  252.  LDA DELTY ;INTERCHANGE DELTX,Y
  253.  STA DELTX
  254.  LDA DELTY+1
  255.  STA DELTX+1
  256.  STX DELTY
  257.  STY DELTY+1
  258.  CLC
  259.  LDA I
  260.  ADC #8
  261.  STA I
  262. MV3 LDA DELTX ;FORM E=-DELTX/2
  263.  JSR COMPL
  264.  STA E
  265.  LDA DELTX+1
  266.  JSR COMPH
  267.  STA E+1
  268.  SEC ;CHECK FOR NEGATIVE
  269.  BMI MV4
  270.  CLC
  271. MV4 ROR E+1 ;DIVIDE BY 2
  272.  ROR E
  273.  LDY #0 ;SET Y=0
  274.  STY C ;SET COUNTER TO ZERO
  275.  STY C+1
  276.  BEQ MV7 ;ABSOLUTE BRANCH
  277. ;
  278. ;** MAIN DRAWING LOOP **
  279. ;
  280. MV5 LDX I ;GET DIRECTION IN X
  281.  CLC ;FORM E=E+DELTY
  282.  LDA E
  283.  ADC DELTY
  284.  STA E ;FIRST LOW BYTE
  285.  LDA E+1
  286.  ADC DELTY+1
  287.  STA E+1
  288.  BMI MV6
  289.  SEC ;FORM E=E-DELTX
  290.  LDA E
  291.  SBC DELTX
  292.  STA E
  293.  LDA E+1
  294.  SBC DELTX+1
  295.  STA E+1
  296.  INX ;X BUMPED UP ONE
  297. MV6 JSR OUTPLT ;OUTPUT ONE MOVE
  298.  INC C ;BUMP COUNTER UP 1
  299.  BNE MV7
  300.  INC C+1
  301. ;
  302. ;ENTER HERE ON 1ST PASS
  303. ;
  304. MV7 LDA (BYT),Y ;TURN ON A POINT
  305.  ORA BITNO
  306.  STA (BYT),Y
  307.  LDA C ;DONE WHEN C > = DELTX
  308.  CMP DELTX
  309.  LDA C+1
  310.  SBC DELTX+1
  311.  BCC MV5
  312.  RTS ;DONE
  313. ;
  314. ;** OUTPLT **
  315. ;
  316. ;OUTPUT AN ELEMENTARY MOVE
  317. ;
  318. OUTPLT TXA
  319.  ASL A ;MULT BY TWO TO GET INDEX
  320.  TAX
  321.  LDA MOVTAB+1,X ;GET THE VECTOR
  322.  PHA ;HIGH BYTE ON STACK
  323.  LDA MOVTAB,X
  324.  PHA ;LOW BYTE ON STACK
  325.  RTS ;DO COMPUTED JUMP
  326. ;
  327. ;RETURN VIA RTS TO JSR OUTPLT(1)
  328. ;
  329. ;**RNGCHK**
  330. ;
  331. ;CHECK X2, Y2 FOR OVERFLOW
  332. ;RETURN TO CALLING PROGRAM ON OVERFLOW
  333. ;
  334. RNGCHK LDA X2 ;CHECK X2, LOW
  335.  CMP #<XMAX
  336.  LDA X2+1 ;CHECK HIGH BYTE
  337.  SBC #>XMAX
  338.  BCS RNG2 ;X2 > XMAX, SO ABORT
  339. RNG1 LDA Y2 ;CHECK Y2, LOW
  340.  CMP #<YMAX
  341.  LDA Y2+1 ;CHECK HIGH BYTE
  342.  SBC #>YMAX
  343.  BCC RNG3 ;Y2 < YMAX, SO OK
  344. RNG2 JSR HRREST ;RESTORE NORMAL
  345.  LDX #14 ;ILLEGAL QUANTITY ERROR
  346.  JMP (ERRVEC) ;FUNNEL THROUGH ERROR ROUTINE
  347. RNG3 RTS
  348. ;
  349. ;COMPL,H
  350. ;
  351. ;FORM COMPLEMENT OF SIGNED NUMBER
  352. ;1ST ENTER AT COMPL FOR LOW BYTE
  353. ;THEN ENTER AT COMPH FOR HIGH BYTE
  354. ;
  355. ;ANSWER IN A
  356. ;
  357. COMPL SEC ;FOR LOW BYTE
  358. COMPH EOR #$FF ;COMPLEMENT
  359.  ADC #0 ;ADD CARRY STATE
  360.  RTS
  361. ;
  362. LL JSR LEFT ;GO LEFT AND FALL THROUGH TO DOWN
  363. DOWN LDA BYT
  364.  AND #7 ;EXAM LOWEST 3 BITS
  365.  EOR #7 ;FLIP THEM
  366.  BEQ DN2 ;ORIGINAL BYTE WAS XXXX111
  367.  INC BYT ;ELSE JUST BUMP BY 1
  368.  BNE DN3
  369.  INC BYT+1
  370.  BNE DN3 ;BRANCH ALWAYS
  371. DN2 CLC ;ADD 320-7
  372.  LDA BYT
  373.  ADC #<313
  374.  STA BYT
  375.  LDA BYT+1
  376.  ADC #>313
  377.  STA BYT+1
  378. DN3 RTS
  379. ;
  380. UR JSR RIGHT ;FIRST RIGHT THEN FALL THROUGH TO UP
  381. UP LDA BYT
  382.  AND #7 ;CHECK LOW BITS
  383.  BNE UP1 ;IF BYTE WAS NOT XXXXX000
  384.  SEC ;ELSE SUBTRACT 320-7
  385.  LDA BYT
  386.  SBC #<313
  387.  STA BYT
  388.  LDA BYT+1
  389.  SBC #>313
  390.  STA BYT+1
  391.  BNE UP3 ;BRANCH ALWAYS
  392. UP1 LDA BYT ;DECREMENT BY 1
  393.  BNE UP2
  394.  DEC BYT+1
  395. UP2 DEC BYT
  396. UP3 RTS
  397. ;
  398. UL JSR UP ;1ST UP THEN FALL THROUGH TO LEFT
  399. LEFT ASL BITNO ;GO 1 PIXEL LEFT
  400.  BCC LF2 ;NO CORRECTION ON CARRY CLEAR
  401.  ROL BITNO ;SET BITNO=1 AND CLEAR CARRY
  402.  LDA BYT
  403.  SBC #7 ;(-8 SINCE CARRY IS CLEAR)
  404.  STA BYT
  405.  BCS LF2
  406.  DEC BYT+1
  407. LF2 RTS
  408. ;
  409. LR JSR DOWN ;1ST DOWN THEN FALL THROUGH TO RIGHT
  410. RIGHT LSR BITNO ;GO 1 PIXEL RIGHT
  411.  BCC RGT1
  412.  ROR BITNO ;SET BITNO=$80 AND CLEAR CARRY
  413.  LDA BYT
  414.  ADC #8 ;ONE CELL RIGHT
  415.  STA BYT
  416.  BCC RGT1
  417.  INC BYT+1
  418. RGT1 RTS
  419. ;
  420. ;CLRHR
  421. ;
  422. ;CLEARS EXACTLY 8000 BYTES
  423. ;LEAVES Y=X=0
  424. ;
  425. CLRHR LDA #>HRLAST
  426.  STA BYT+1 ;INIT. POINTER TO LAST PAGE
  427.  LDA #0
  428.  STA BYT
  429.  TAY
  430.  STA BYT
  431.  STA (BYT),Y ;THIS ONE DONE SEPARATELY
  432.  LDY #<HRLAST ;START AT BASE+$1F3F
  433.  LDX #$20 ;X KEEPS TRACK OF PAGES
  434. CLRHR1 STA (BYT),Y ;PUT IN 0'S
  435.  DEY
  436.  BNE CLRHR1
  437.  DEC BYT+1
  438.  DEX
  439.  BNE CLRHR1 ;DO 32 PAGES
  440.  RTS
  441. ;
  442. ;SETCOL
  443. ;
  444. ;SET FOREGROUND/BACKGROUND COLOR
  445. ;
  446. SETCOL LDA #COLOR ;IN 2 NYBBLES
  447. SETCL0 LDX #0
  448. SETCL1 STA SCREEN,X ;DO 4 PAGES
  449.  STA SCREEN+$0100,X
  450.  STA SCREEN+$0200,X
  451.  INX
  452.  BNE SETCL1
  453.  LDX #<SCREND+1 ;DO LAST PAGE
  454. SETCL2 STA SCREEN+$02FF,X
  455.  DEX
  456.  BNE SETCL2
  457.  RTS
  458. ;
  459. ;HRINIT - SETS UP HI-RES
  460. ;
  461. HRINIT LDA HRCTRL ;HI-RES MODE
  462.  ORA #$20 ;TURN ON BIT 5
  463.  STA HRCTRL
  464.  LDA HRMREG ;BYT AT $2000
  465.  ORA #$08 ;TURN ON BIT 3
  466.  STA HRMREG
  467.  JSR SETCOL ;FORCE BLACK AND GREEN
  468.  JSR CLRHR ;FORCE TO ALL ZEROES
  469.  LDA ERRVEC ;REMEMBER SYSTEM ERROR VECTOR
  470.  STA ERVEC
  471.  LDA ERRVEC+1
  472.  STA ERVEC+1
  473.  LDA #<ABRT ;SET UP NEW ERROR RECOVERY
  474.  STA ERRVEC
  475.  LDA #>ABRT
  476.  STA ERRVEC+1
  477.  RTS
  478. ;
  479. ;HRREST - RESTORE NORMAL MODE
  480. ;
  481. HRREST JSR CLRHR ;CLEAR HI-RES
  482.  LDA HRCTRL ;MODE REGISTER
  483.  AND #%11011111 ;TURN OFF BIT 5
  484.  STA HRCTRL
  485.  LDA HRMREG ;MEMORY REGISTER
  486.  AND #%11110111 ;TURN OFF BIT 3
  487.  STA HRMREG
  488.  LDA #' ' ;FILL SCREEN WITH SPACES
  489.  JSR SETCL0
  490.  LDA ERVEC ;RESTORE SYSTEM ERROR VECTOR
  491.  STA ERRVEC
  492.  LDA ERVEC+1
  493.  STA ERRVEC+1
  494.  RTS
  495. ;
  496. ;GETVAL - GET PARAMETER
  497. ;
  498. GETVAL JSR CHKCOM ;CHECK FOR COMMA
  499.  JSR EVAEXP ;EVALUATE EXPRESSION
  500.  JSR FLTFIX ;CONVERT TO INTEGER IN Y AND A
  501.  RTS
  502. ;
  503. ;ENTER HERE IF FROM BASIC
  504. ;
  505. SETPIX JSR HRMOVE
  506. ;
  507. ;ENTER HERE IF X1,Y1 ALREADY SET
  508. ;
  509. STPIX0 LDY #0
  510.  LDA (BYT),Y
  511.  ORA BITNO
  512.  STA (BYT),Y
  513.  RTS
  514. ;
  515. ;ERROR RECOVERY
  516. ;
  517. ABRT PHA ;SAVE REGS
  518.  TXA
  519.  PHA
  520.  TYA
  521.  PHA
  522.  JSR HRREST ;RESTORE TO NORMAL
  523.  PLA ;RESTORE REGS
  524.  TAY
  525.  PLA
  526.  TAX
  527.  PLA
  528.  JMP (ERRVEC) ;ERROR MESSAGE
  529. ;
  530. MOVTAB .WORD RIGHT-1
  531.  .WORD UR-1
  532.  .WORD LEFT-1
  533.  .WORD UL-1
  534.  .WORD RIGHT-1
  535.  .WORD LR-1
  536.  .WORD LEFT-1
  537.  .WORD LL-1
  538.  .WORD UP-1
  539.  .WORD UR-1
  540.  .WORD UP-1
  541.  .WORD UL-1
  542.  .WORD DOWN-1
  543.  .WORD LR-1
  544.  .WORD DOWN-1
  545.  .WORD LL-1
  546. ;
  547. MSKTB .BYTE $80,$40,$20,$10
  548.  .BYTE $08,$04,$02,$01
  549. ;
  550. .END
  551.